import axios from 'axios';
import { Message } from 'element-ui';
import store from '@/store';
import { getAccessToken } from '@/utils/storage';
import router from '@/router';

const service = axios.create({
  // baseURL: process.env.NODE_ENV === 'production' ? '' : '/api', // url = base url + request url
  baseURL: 'http://localhost:4001/api/v1',
  timeout: 5000,
});

service.interceptors.request.use(
  (config) => {
    if (store.getters.access_token) {
      config.headers.Authorization = getAccessToken();
    }
    return config;
  },
  (error) => {
    console.log(error);
    return Promise.reject(error);
  }
);

service.interceptors.response.use(
  (response) => {
    const { status } = response;
    const res = response?.data;

    switch (status) {
      case 200: // OK 服务器成功返回用户请求的数据，该操作是幂等的（Idempotent）
        break;
      case 201: // CREATED - [POST/PUT/PATCH] 用户新建或修改数据成功
        break;
      case 202: // Accepted - [*] 表示一个请求已经进入后台排队（异步任务）
        break;
      default:
        break;
    }
    return Promise.resolve(res.data);
  },
  (error) => {
    // console.log('err:' + JSON.stringify(error.response.status)); // for debug
    let message = '';
    const { status, data } = error.response;
    console.error(data.error);
    switch (status) {
      case 400: //  INVALID REQUEST - [POST/PUT/PATCH]：用户发出的请求有错误，服务器没有进行新建或修改数据的操作，该操作是幂等的。
        message = status + ':发出的请求有错误' + data.error;
        break;
      case 401: // Unauthorized - [*]：表示用户没有权限（令牌、用户名、密码错误）。
        message = status + ':未授权请重新登录' + data.error;
        store.dispatch('user/logout').then(() => router.push('/login'));

        break;
      case 403: // Forbidden - [*] 表示用户得到授权（与401错误相对），但是访问是被禁止的。
        message = status + ':服务器拒绝访问' + data.error;
        break;
      case 404: // NOT FOUND - [*]：用户发出的请求针对的是不存在的记录，服务器没有进行操作，该操作是幂等的。
        message = status + ':资源未找到' + data.error;
        break;
      case 406: // Not Acceptable - [GET]：用户请求的格式不可得（比如用户请求JSON格式，但是只有XML格式）。
        message = status + ':请求格式错误' + data.error;
        break;
      case 410: //  Gone -[GET]：用户请求的资源被永久删除，且不会再得到的。
        message = status + ':资源已被永久删除' + data.error;
        break;
      case 422: // Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时，发生一个验证错误。
        message = status + ':参数验证错误' + data.error;
        break;
      case 500: //  INTERNAL SERVER ERROR - [*]：服务器发生错误，用户将无法判断发出的请求是否成功。
        message = status + ':服务器内部错误' + data.error;
        break;
      default:
        message = status + ':未知错误';
    }
    Message({
      message,
      type: 'error',
      duration: 5 * 1000,
    });
    return Promise.reject(error);
  }
);

export default service;
